package com.smartinput.security

import org.slf4j.LoggerFactory
import org.springframework.stereotype.Component
import java.util.regex.Pattern

@Component
class UrlPatternMatcher {
    private val logger = LoggerFactory.getLogger(UrlPatternMatcher::class.java)

    /**
     * 检查请求URI是否匹配任何跳过模式
     * @param requestUri 请求URI
     * @param skipPatterns 跳过模式列表（逗号分隔）
     * @return 如果匹配任何模式则返回true
     */
    fun shouldSkipJwtValidation(requestUri: String, skipPatterns: String): Boolean {
        if (skipPatterns.isBlank()) {
            return false
        }

        val patterns = skipPatterns.split(",").map { it.trim() }
        logger.debug("检查URI: $requestUri 是否匹配模式: $patterns")

        val result = patterns.any { pattern ->
            val matches = matchesPattern(requestUri, pattern)
            logger.debug("模式 '$pattern' 匹配 '$requestUri': $matches")
            matches
        }

        logger.debug("最终结果: $result")
        return result
    }

    /**
     * 检查请求URI是否匹配指定的模式
     * @param requestUri 请求URI
     * @param pattern 模式（支持通配符 ** 和 *）
     * @return 如果匹配则返回true
     */
    private fun matchesPattern(requestUri: String, pattern: String): Boolean {
        // 将通配符模式转换为正则表达式
        val regexPattern = pattern
            .replace("**", ".*") // ** 匹配任意数量的字符
            .replace("*", "[^/]*") // * 匹配除/外的任意字符
            .replace("?", "\\?") // 转义问号
            .replace(".", "\\.") // 转义点号

        val regex = Pattern.compile("^$regexPattern$")
        return regex.matcher(requestUri).matches()
    }
} 